package 多线程;
/*
  线程中断方法
  1，interrupt()方法做中断标记
    线程内部interrupted()方法检测标记，然后终止线程指令
	需要特别注意，中断标记是否会被异常清除
  2,自定义中断(推荐)
    自定义标记，通过设置标记控制线程什么时候中断
  
*/
public class X03线程中断
{
	public static void main(String[]args){
		MyRunnable3 mr3=new MyRunnable3();
		Thread t=new Thread(mr3);
		t.start();
		MyRunnable4 mr4=new MyRunnable4();
		Thread t1=new Thread(mr4);
		t1.start();
		

		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+"我是main线程 "+"=|=|="+i);
			try
			{
				Thread.sleep(300);
			}
			catch (InterruptedException e)
			{}
			if(i==5){
				t.interrupt();//中断线程,此处只是做了个中断标记，中不中断线程决定
				//自定义标记终止
				mr4.flag=false;//实际开发中尽量利用set方法，这行注释的话T1线程会一直运行
			}
		}
	}
}

class MyRunnable3 implements Runnable
{

	@Override
	public void run()
	{
		for(int i=0;i<10;i++){
			if(Thread.interrupted()){//此方法检测中断标记状态，并清除标记
				System.out.println("我是线程T，我要中断了.");//中断前可以做一些数据处理
				break;//如果sleep抛出异常时已经清除中断标记，所以不添加标记的话，break不会执行
			}
			System.out.println(Thread.currentThread().getName()+"我是线程T "+"=|=|="+i);
			try
			{
				Thread.sleep(300);//抛出异常时会清除中断标记
			}
			catch (InterruptedException e){
				e.printStackTrace();
				Thread.currentThread().interrupt();//sleep抛异常后，再加一个中断标记
			}
		}
	}
}
class MyRunnable4 implements Runnable
{
	public boolean flag=true;//实际开发中建议私有，用set/get方法
	
	@Override
	public void run()
	{
		int i=0;
		while(flag){
			System.out.println(Thread.currentThread().getName()+"我是线程T1 "+"=|=|="+i++);
			try
			{
				Thread.sleep(300);//抛出异常时会清除中断标记
			}
			catch (InterruptedException e){}
		}
	}
}
